<?php


namespace app\api\service;


use app\lib\exception\TokenException;
use app\lib\exception\WeChatException;
use think\Cache;
use think\Exception;
use app\api\model\User as UserModel;
class UserToken extends Token
{
    protected $code;
    protected $wxAppID;
    protected $wxAppSecret;
    protected $wxLoginUrl;
    function __construct($code)
    {
        $this->$code = $code;
        $this->wxAppID = config('wx.app_id');
        $this->wxAppSecret = config('wx.app_secret');
        $this->wxLoginUrl = sprintf(config('wx.login_url'),$this->wxAppID,$this->wxAppSecret,$this->$code);

    }

    public  function  get(){
      $result =  curl_get($this->wxLoginUrl);
      $wxResult = json_decode($result,true);
      if (empty($wxResult)){
          throw new  Exception('微信相关异常');
      }else{
          $wxResult['openid'] = '1111111';
          $loginFail = array_key_exists('errcode',$wxResult);
//          if ($loginFail){
//                $this->processLoginError($wxResult);
//          }else{
             return  $this->grantToken($wxResult);
//          }
      }
    }

    private function  grantToken($wxResult){
        // 获取到openid
        // 数据库查看一下，这个opneid 是不是已经存在
        // 如果存在 则不处理， 如果不存在那么新增一条user记录
        // 生成令牌，准备缓存数据，写入缓存
        // 把令牌返回给客户端去
        // key: 令牌。 value: wxResult，uid,scope
        $openid = $wxResult['openid'];
        $user = UserModel::getByOpenID($openid);
       if ($user){
           $uid = $user->id;
       }else{
           $uid =  $this->createUser($openid);
       }
       $cacheValue = $this->prepareCacheValue($wxResult,$uid);
       $token = $this->saveToCache($cacheValue);
       return $token;

    }

    private function saveToCache($cacheValue){
        $key = self::generateToken();
        $value = json_encode($cacheValue);
        $expire_in = config('setting.token_expire_in');
//        $request = cache($key,$value,$expire_in);
        $request =  Cache::set($key,$value,$expire_in);
        return $request;
        if (!$request){
            throw  new TokenException([
                'msg' => '服务器缓存异常',
                'errorCode' => 10005
            ]);
        }
    return $key;
    }


    private function  prepareCacheValue($wxResult,$uid){
        $cacheValue = $wxResult;
        $cacheValue['uid'] = $uid;
        $cacheValue['scope'] = 16;
        return $cacheValue;
    }

    private function createUser($openid){
        $user = UserModel::create([
               'openid' => $openid
            ]);
        return $user->id;
    }

    private function processLoginError($wxResult)
    {
        throw  new  WeChatException([
            'msg' => $wxResult['errmsg'],
            'errorCode' => $wxResult['errcode']
        ]);
    }

}